package com.example.springbooteasycode.zjrc.project.OuterMidProd;

import java.nio.charset.StandardCharsets;

/**
 * 获取版本号-00指令
 * @author: csa
 * @date: 2025/08/08
 */
public class VersionCommand00 {

    /**
     * 应答码(“A”)+版本信息
     * 001C(28位长度)+41("A") + 43534D506F757465722056312E302E3020323031362D30372D3235("版本信息")
     * @param args
     */
    public static void main(String[] args) {
        // 初始化 SndUnit
        SndUnit sndUnit = new SndUnit();
        // 假设初始 dwLen 为 0
        sndUnit.setDwLen((short) 0);

        // 执行版本号填充逻辑（对应 C 的 Cmd00）
        cmd00(sndUnit);

        // 输出结果，验证是否正确
        System.out.println("dwLen: " + sndUnit.getDwLen());
        System.out.println("bData: " + new String(sndUnit.getBData(), 0, sndUnit.getDwLen(), StandardCharsets.UTF_8));
        // 输出版本号为十六进制字符串格式
        System.out.println("dwLen: " + bytesToHex(new byte[]{(byte) sndUnit.getDwLen()}));
        System.out.println("bData: " + bytesToHex(sndUnit.getBData()));



        // 示例：ASCII字符串（只包含ASCII范围内的字符，即0-127）
        String asciiStr = "CSMPouter V1.0.1 2021-07-28";

        // 将ASCII字符串转换为byte[]（使用US_ASCII编码）
        byte[] byteArray = asciiStr.getBytes(StandardCharsets.US_ASCII);

        // 打印结果（十六进制形式，便于查看与C语言中strcpy的对应关系）
        System.out.println("ASCII字符串: " + asciiStr);
        System.out.print("转换后的byte[]（十六进制）: ");
        for (byte b : byteArray) {
            // 转换为两位十六进制，如 'C' -> 43
            System.out.printf("%02X ", b);
        }
    }




    // 定义版本号常量，与 C 中 CSMPOUTER_VERSION 一致
//    private static final String CSMPOUTER_VERSION = "CSMPouter V1.0.1 2021-07-28";
    private static final String CSMPOUTER_VERSION = "CSMPouter V1.0.0 2016-07-25";


    public static void cmd00(SndUnit sndUn) {
        try {
            // 1. 将版本号字符串转为字节数组（模拟 strcpy）
//            byte[] versionBytes = CSMPOUTER_VERSION.getBytes(StandardCharsets.UTF_8);
            byte[] versionBytes = CSMPOUTER_VERSION.getBytes();


            // 2. 拷贝到 SndUnit 的 bData（需注意数组长度，防止溢出）
            if (versionBytes.length > sndUn.getBData().length) {
                // 实际场景需处理数组越界，这里简单抛异常示意
                throw new RuntimeException("bData 容量不足，无法存储版本号");
            }
            System.arraycopy(versionBytes, 0, sndUn.getBData(), 0, versionBytes.length);

            // 3. 更新 dwLen（模拟 C 中 strlen + 累加）
            sndUn.setDwLen((short) (sndUn.getDwLen() + versionBytes.length));

        } catch (Exception e) {
            e.printStackTrace();
            // 异常处理，如返回错误码等
        }
    }

    // 辅助方法，方便外部获取版本号常量
    public static String getCSMPOUTER_VERSION() {
        return CSMPOUTER_VERSION;
    }


    /**
     * 将字节数组转换为十六进制字符串表示
     * todo：不是主逻辑，辅助打印
     */
    private static String bytesToHex(byte[] bytes) {
        StringBuilder result = new StringBuilder();
        for (byte b : bytes) {
            // 输出有空格
//            result.append(String.format("%02X ", b));
            // 输出无空格
            result.append(String.format("%02X", b));
        }
        return result.toString();
    }
}
